package org.example.ItemCF.src.recommend;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 此Reducer类用于聚合Map阶段产生的中间结果，计算每个用户对所有物品的总偏好值，
 * 生成最终的推荐列表。
 */
public class Step4AggregateAndRecommendReducer extends
        Reducer<IntWritable, Text, IntWritable, Text> {
    private final static Text v = new Text();

    /**
     * 对于每个用户，聚合所有物品和相应的偏好值，计算用户对每个物品的总偏好值，
     * 然后将结果写入输出上下文。
     */
    @Override
    public void reduce(IntWritable key, Iterable<Text> values,
                       Context context) throws IOException, InterruptedException {
        Map<String, Double> result = new HashMap<String, Double>();
        for (Text value : values) {
            String[] str = value.toString().split(",");
            if (result.containsKey(str[0])) {
                result.put(str[0],
                        result.get(str[0]) + Double.parseDouble(str[1])); // 计算总偏好值
            } else {
                result.put(str[0], Double.parseDouble(str[1]));
            }
        }

        Iterator<String> iter = result.keySet().iterator();
        while (iter.hasNext()) {
            String itemID = iter.next();
            double score = result.get(itemID);
            v.set(itemID + "," + score);
            context.write(key, v);
        }
    }
}
   
